/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package op.contasresumidas;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import op.QuebraStringOI;
import op.Telefone;

/**
 *
 * @author Jônatas
 */
public class GetResumoOi extends GetResumo {

    public static Pattern assinatura = Pattern.compile("([0-9]{2} A [0-9]{2}/[0-9]{2}/[0-9]{2}|REF[.])");
    public static Pattern data = Pattern.compile("[0-9]{2}/[0-9]{2}/[0-9]{4}");
    public static Pattern assinaturaMesAno = Pattern.compile("[A-Z]{3}/[0-9]{2}");

    public GetResumoOi(String[] lines) {
        super(lines);
    }

    public static Date createDate(String data) {

        Calendar calendar = Calendar.getInstance();
        String[] dia = data.split("/");

        calendar.set(Integer.parseInt(dia[2]), (Integer.parseInt(dia[1]) - 1), Integer.parseInt(dia[0]));

        return calendar.getTime();
    }

    public static String dateToString(Date data) {

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(data);

        String resp = calendar.get(Calendar.DAY_OF_MONTH) + "/";
        resp += (calendar.get(Calendar.MONTH) + 1) + "/";
        resp += "" + calendar.get(Calendar.YEAR);

        return resp;
    }

    public List<ContaResumida> getContaResumida() {

        ContaResumida contaResumida = new ContaResumida();
        String ddd = null;
        Telefone origem = null;

        Date vencimento = null;

        int ocorrencia = 0;

        List<ContaResumida> contas = new ArrayList<ContaResumida>();

        boolean voiceNet = true;

        tagFor:
        for (int i = 0; i < this.lines.length; i++) {

            String line = this.lines[i].trim();

            if (line.length() == 0) {
                continue;
            }

            // DDD
            if ((ddd == null) && line.startsWith("CODIGO DDD")) {
                line = this.lines[++i].trim();
                ddd = line;
                continue;
            }

            Matcher match = data.matcher(line);

            if (ocorrencia < 2 && match.find()) {

                if (++ocorrencia == 2) {
                    Date d = createDate(line);
                    vencimento = d;
                }

            }

            // ORIGEM
            if (origem == null) {
                String[] tokens = line.split(" ");
                String fone = tokens[0];
                Matcher m = QuebraStringOI.telefone.matcher(fone);

                if (m.find()) {
                    fone = m.group();
                    String num1 = fone.substring(0, 4);
                    String num2 = fone.substring(5);
                    if (ddd != null) {
                        origem = new Telefone(ddd, num1, num2);
                    } else {
                        origem = new Telefone(num1, num2);
                    }
                    contaResumida.setTelefone(origem);
                    try {
                        contaResumida.setNome(in_out.GeraRelatorio.pegaNome(origem.toString()));
                    } catch (Exception ex) {
                        Logger.getLogger(GetResumoOi.class.getName()).log(Level.SEVERE, null, ex);
                        contaResumida.setNome("");
                    }
                    contas.add(contaResumida);
                }

                continue;
            }

            if (line.startsWith("SUBTOTAL DO TELEFONE")) {
                contaResumida = new ContaResumida();
                voiceNet = true;
                line = this.lines[++i].trim();

                while (!line.contains("TELEFONE")) {

                    if (line.contains("RESUMO GERAL") || line.contains("TOTAL NOTA FISCAL")) {
                        break;
                    }

                    line = this.lines[++i].trim();
                }

                Matcher m = QuebraStringOI.telefone.matcher(line);

                if (m.find()) {
                    String fone = m.group();
                    String num1 = fone.substring(0, 4);
                    String num2 = fone.substring(5);
                    origem = new Telefone(ddd, num1, num2);
                    contaResumida.setTelefone(origem);
                    if (!contas.contains(contaResumida)) {
                        contas.add(contaResumida);
                    }
                }

                continue;

            }

            // minutos excedentes
            if (line.equals("LIGACOES LOCAIS")) {

                while (!line.startsWith("SUBTOTAL")) {
                    line = this.lines[++i].trim();
                    if (line.contains("MINUTOS ALEM DA FRANQUIA")) {
                        StringTokenizer tokenizer = new StringTokenizer(line.substring(
                                line.indexOf("MINUTOS ALEM DA FRANQUIA")));

                        tokenizer.nextToken();
                        tokenizer.nextToken();
                        tokenizer.nextToken();
                        tokenizer.nextToken();

                        contaResumida.setMinutosAlemFranqua(
                                ContaResumida.segStringToLong(tokenizer.nextToken()));

                        contaResumida.setValorAlemFranquia(getValor(line));

                    }
                }

                contaResumida.setLigacoesLocais(getValor(line) + contaResumida.getLigacoesLocais());

                continue;

            }

            // Servicos mensais, bloqueios, assinatura, outros
            if (line.equals("SERVICOS MENSAIS")) {

                double bloqueio = 0.0;
                double outros = 0.0;
                double valorAssinatura = 0.0;

                Pattern p = Pattern.compile("PA\\d");

                while (!line.startsWith("SUBTOTAL")) {
//PA1

                    line = this.lines[++i].trim();

                    Matcher m = p.matcher(line);

                    if (line.contains("BLOQ.") || line.contains("BLOQUEIO")) {
                        bloqueio += getValor(line);
                    } else if (line.contains("ASS. ") || line.contains("ASSINATURA")) {
                        int comeco = line.indexOf("ASS");
                        match = assinatura.matcher(line);
                        int fim = -1;
                        if (match.find()) {
                            fim = match.start();
                        } else {
                            match = assinaturaMesAno.matcher(line);
                            if (match.find()) {
                                fim = match.start();
                            } else {
                                String possivelPlano = "LDN";
                                fim = line.indexOf(possivelPlano) + possivelPlano.length();
                            }
                        }
                        contaResumida.setTipoAssinatura(line.substring(comeco, fim).trim());

                        valorAssinatura += getValor(line);
                    } else if (m.find()) {
                        int comeco = m.start();
                        match = assinatura.matcher(line);
                        match.find();
                        int fim = match.start();
                        contaResumida.setTipoAssinatura(line.substring(comeco, fim).trim());
                        valorAssinatura += getValor(line);
                    } else if (!line.startsWith("SUBTOTAL")) {
                        outros += getValor(line);
                    }

                }

                contaResumida.setBloqueios(bloqueio);
                if (valorAssinatura != 0.0) {
                    contaResumida.setAssinatura(valorAssinatura);
                    voiceNet = false;
                }
                contaResumida.setOutros(outros);

                continue;

            }

            // Servicos eventuais
            if (line.startsWith("SERVICOS EVENTUAIS")) {

                while (!line.startsWith("SUBTOTAL")) {
                    line = this.lines[++i].trim();
                }

                contaResumida.setServicosEventuais(getValor(line));

                continue;

            }

            // Assinatura voice net
            if (voiceNet && line.equals("TC VOICE NET")) {

                do {
                    line = this.lines[++i].trim();
                    match = assinatura.matcher(line);
                } while (!match.find());

                int comeco = line.indexOf("TC VOICE");

                if (comeco < 0) {
                    comeco = line.indexOf("ASS");
                }

                int fim = match.start();

                contaResumida.setTipoAssinatura(line.substring(comeco, fim).trim());

                while (!line.startsWith("SUBTOTAL")) {
                    line = this.lines[++i];
                }

                contaResumida.setAssinatura(getValor(line));

                continue;

            }

            // local pra celular
            if (line.equals("LIGACOES LOCAIS PARA CELULAR")) {

                while (!line.startsWith("SUBTOTAL")) {
                    line = this.lines[++i].trim();
                }

                contaResumida.setLigacoesCelularLocais(getValor(line));

                continue;

            }

            // local pra celular
            if (line.equals("LIGACOES LOCAIS A COBRAR DE CELULAR")) {

                while (!line.startsWith("SUBTOTAL")) {
                    line = this.lines[++i].trim();
                }

                contaResumida.setLigacoesACobrar(getValor(line) + contaResumida.getLigacoesACobrar());

                continue;

            }

            // ligacao DDD 31
            if (line.startsWith("LIGACOES LONGA DISTANCIA NACIONAL COM 31")) {

                while (!line.startsWith("SUBTOTAL")) {
                    line = this.lines[++i].trim();
                }

                contaResumida.setLigacoesInterurbano(getValor(line));

                continue;
            }

            // ligacao DDD LIG.LONG.DIST.NACIONAL A COBRAR DE CELULAR COM 31
            if (line.equals("LIGACOES LONGA DISTANCIA NACIONAL")) {

                while (!line.startsWith("SUBTOTAL")) {
                    line = this.lines[++i].trim();
                }

                contaResumida.setLigacoesInterurbanoOutrasOperadoras(contaResumida.getLigacoesInterurbanoOutrasOperadoras() + getValor(line));

                continue;
            }

            // ligacao DDD a cobrar de celular
            if (line.equals("LIG.LONG.DIST.NACIONAL A COBRAR DE CELULAR COM 31")) {

                while (!line.startsWith("SUBTOTAL")) {
                    line = this.lines[++i].trim();
                }

                contaResumida.setCelularInterurbanoACobrar(contaResumida.getCelularInterurbanoACobrar() + getValor(line));

                continue;
            }

            // ligacao DDD para celular
            if (line.equals("LIG. LONGA DISTANCIA NACIONAL PARA CELULAR COM 31")) {

                while (!line.startsWith("SUBTOTAL")) {
                    line = this.lines[++i].trim();
                }

                contaResumida.setLigacoesCelularInterurbano(getValor(line));

                continue;


            }

            // ligacao DDD para celular
            if (line.equals("LIG. LONGA DISTANCIA NACIONAL PARA CELULAR")) {

                while (!line.startsWith("SUBTOTAL")) {
                    line = this.lines[++i].trim();
                }

                contaResumida.setLigacoesCelularInterurbanoOutrasOperadoras(getValor(line));

                continue;


            }

            // Juros
            if (line.startsWith("OUTROS VALORES OI FIXO")) {

                double valor = 0.0;

                while (!line.startsWith("TOTAL OUTROS VALORES") && !line.contains("RESUMO GERAL")) {
                    line = this.lines[++i].trim();

                    if (line.matches("[0-9]{4}/[0-9]{2}.+")) {
                        valor += getValor(line);
                    }

                }

                contas.get(0).setJuros(valor);

                continue;

            }

            // Juros
            if (line.startsWith("SERVICO DE TERCEIROS")) {

                while (!(line.startsWith("TOTAL SERVICO DE TERCEIROS")
                        || line.startsWith("TOTAL SERVICOS DE TERCEIROS"))) {
                    line = this.lines[++i].trim();
                }

                contas.get(0).setOutros(contas.get(0).getOutros() + getValor(line));

                continue;

            }

            // Desconto
            if (line.startsWith("DESCONTO") || line.startsWith("CREDITOS")) {

                while (!line.startsWith("SUBTOTAL") && !line.startsWith("TOTAL")) {
                    line = this.lines[++i].trim();
                }

                contas.get(0).setDescontos(getValor(line));

                continue;

            }

            // Velox

            if (line.startsWith("OI VELOX")) {

                while (!line.startsWith("SUBTOTAL")) {
                    line = this.lines[++i].trim();
                }

                contas.get(0).setVelox(getValor(line));

                continue;

            }

            // Total
            if (line.startsWith("TOTAL")) {

                StringTokenizer token = new StringTokenizer(line);
                if (token.countTokens() != 2) {
                    continue;
                }

                contas.get(0).setTotal(getValor(line));

                continue;

            }


        }

        boolean temTotal = false;

        for (ContaResumida conta : contas) {
            if (conta.getTotal() != 0.0) {
                temTotal = true;
            }
            conta.setVencimento(vencimento);
        }

        if (!temTotal) {
            double total = 0.0;
            for (String line : lines) {
                if (line.contains("TOTAL NOTA FISCAL SERVICOS")) {
                    total = getValor(line);
                }
            }
            contas.get(0).setTotal(total);
        }

        return contas;

    }
}
